package com.ezjie.baselib.util;

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.util.Locale;


import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.util.Log;

/**
 * 一个日志的工具类 可以开启和关闭打印日志 最好不要用System打印，消耗内存。
 * 
 * @author renyangyang
 * 
 */
public class LogUtils {

	private static boolean isLogEnabled = true;// 默认开启
	private static final String defaultTag = "log";// log默认的 tag
	private static final String TAG_CONTENT_PRINT = "%s.%s:%d";

	private static final String ERROR = "----WARNING-----EXCEPTION------";
	/**
	 * 获得当前的 堆栈
	 * 
	 * @return
	 */
	private static StackTraceElement getCurrentStackTraceElement() {
		return Thread.currentThread().getStackTrace()[4];

	}

	/**
	 * 
	 * 设置 debug是否启用 根据 判断 是否 为上线模式 android:debuggable 打包后变为false，没打包前为true
	 * 
	 * 要在application中 首先进行调用此方法 对 isLogEnabled 进行赋值
	 * 
	 * @param context
	 * @return
	 */
	public static void setDebugable(Context context) {
		try {
			ApplicationInfo info = context.getApplicationInfo();
			isLogEnabled = (info.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
		} catch (Exception e) {
			// 友盟上报错误日志
			// MobclickAgent.reportError(context, e);
		}
	}
	
	/**
	 * 直接输出的异常信息
	 * 
	 * @param e
	 */
	public static void exception(Throwable e) {
		android.util.Log.d(defaultTag , ERROR+"〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓");
		android.util.Log.e(defaultTag , ERROR+getStack(e));
		android.util.Log.d(defaultTag , ERROR+"〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓");
	}
	
	/**
	 * 获取堆栈信息
	 * 
	 * @param e
	 * @return
	 */
	public static String getStack(Throwable e) {
		String error = null;
		if (e != null) {
			ByteArrayOutputStream baos = null;
			PrintStream ps = null;
			try {
				baos = new ByteArrayOutputStream();
				ps = new PrintStream(baos);
				e.printStackTrace(ps);
				error = baos.toString();
				baos.close();
				ps.close();
			} catch (Exception e1) {
				error = e.toString();
			} finally {
				baos = null;
				ps = null;
			}
		}
		if (BaseConfigure.isDebug()) {
			//writeFile(error);
		}
		return error;
	}

	/**
	 * 获取是否DEBUG模式
	 * 
	 * @return6
	 */
	public static boolean isDebugable() {
		return isLogEnabled;
	}

	/**
	 * 打印的log信息 类名.方法名:行数--->msg
	 * 
	 * @param trace
	 * @return
	 */
	private static String getContent(StackTraceElement trace) {
		return String.format(Locale.CHINA, TAG_CONTENT_PRINT, trace.getClassName(), trace.getMethodName(), trace.getLineNumber());
	}

	/**
	 * debug
	 * 
	 * @param tag
	 * @param msg
	 */
	public static void d(String tag, String msg, Throwable tr) {
		if (isLogEnabled) {
			Log.d(tag, getContent(getCurrentStackTraceElement()) + "--->" + msg, tr);
		}
	}

	/**
	 * debug
	 * 
	 * @param tag
	 * @param msg
	 */
	public static void d(String tag, String msg) {
		if (isLogEnabled) {
			Log.d(tag, getContent(getCurrentStackTraceElement()) + "--->" + msg);
		}
	}

	/**
	 * debug
	 * 
	 * @param tag
	 * @param msg
	 */
	public static void d(String msg) {
		if (isLogEnabled) {
			Log.d(defaultTag, getContent(getCurrentStackTraceElement()) + "--->" + msg);
		}
	}

	/**
	 * error
	 * 
	 * @param tag
	 * @param msg
	 */
	public static void e(String tag, String msg, Throwable tr) {
		if (isLogEnabled) {
			Log.e(tag, getContent(getCurrentStackTraceElement()) + "--->" + msg, tr);
		}
	}

	/**
	 * error
	 * 
	 * @param tag
	 * @param msg
	 */
	public static void e(String tag, String msg) {
		if (isLogEnabled) {
			Log.e(tag, getContent(getCurrentStackTraceElement()) + "--->" + msg);
		}
	}

	/**
	 * error
	 * 
	 * @param tag
	 * @param msg
	 */
	public static void e(String msg) {
		if (isLogEnabled) {
			Log.e(defaultTag, getContent(getCurrentStackTraceElement()) + "--->" + msg);
		}
	}

	/**
	 * info
	 * 
	 * @param tag
	 * @param msg
	 */
	public static void i(String tag, String msg, Throwable tr) {
		if (isLogEnabled) {
			Log.i(tag, getContent(getCurrentStackTraceElement()) + "--->" + msg, tr);
		}
	}

	/**
	 * info
	 * 
	 * @param tag
	 * @param msg
	 */
	public static void i(String tag, String msg) {
		if (isLogEnabled) {
			Log.i(tag, getContent(getCurrentStackTraceElement()) + "--->" + msg);
		}
	}

	/**
	 * info
	 * 
	 * @param tag
	 * @param msg
	 */
	public static void i(String msg) {
		if (isLogEnabled) {
			Log.i(defaultTag, getContent(getCurrentStackTraceElement()) + "--->" + msg);
		}
	}

	/**
	 * verbose
	 * 
	 * @param tag
	 * @param msg
	 */
	public static void v(String tag, String msg, Throwable tr) {
		if (isLogEnabled) {
			Log.v(tag, getContent(getCurrentStackTraceElement()) + "--->" + msg, tr);
		}
	}

	/**
	 * verbose
	 * 
	 * @param tag
	 * @param msg
	 */
	public static void v(String tag, String msg) {
		if (isLogEnabled) {
			Log.v(tag, getContent(getCurrentStackTraceElement()) + "--->" + msg);
		}
	}

	/**
	 * verbose
	 * 
	 * @param tag
	 * @param msg
	 */
	public static void v(String msg) {
		if (isLogEnabled) {
			Log.v(defaultTag, getContent(getCurrentStackTraceElement()) + "--->" + msg);
		}
	}

	/**
	 * warn
	 * 
	 * @param tag
	 * @param msg
	 */
	public static void w(String tag, String msg, Throwable tr) {
		if (isLogEnabled) {
			Log.w(tag, getContent(getCurrentStackTraceElement()) + "--->" + msg, tr);
		}
	}

	/**
	 * warn
	 * 
	 * @param tag
	 * @param msg
	 */
	public static void w(String tag, String msg) {
		if (isLogEnabled) {
			Log.w(tag, getContent(getCurrentStackTraceElement()) + "--->" + msg);
		}
	}

	/**
	 * warn
	 * 
	 * @param tag
	 * @param msg
	 */
	public static void w(String msg) {
		if (isLogEnabled) {
			Log.w(defaultTag, getContent(getCurrentStackTraceElement()) + "--->" + msg);
		}
	}
}
